package com.mbatis.juc.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 三大方法
 *
 * 七大参数
 *
 *
 * 四种拒绝策略
 *
 *  new ThreadPoolExecutor.DiscardPolicy() 队列满了，不会抛出异常
 *  new ThreadPoolExecutor.AbortPolicy() 银行满了，还有人进来，不处理这个人的，抛出异常
 *  new ThreadPoolExecutor.CallerRunsPolicy() 那来的去哪里，会把任务丢给主线程处理
 *  new ThreadPoolExecutor.DiscardOldestPolicy() 对列满了，尝试去和最早的竞争，也不会抛出异常
 *
 *  最大线程到底该如何定义
 *  1.CPU 密集型，几核就设置为几，可以保持cpu的效率最高！
 *  2.IO 密集型 判断你程序中十分耗IO的线程
 */

public class Demo1 {

    public static void main(String[] args) {
        System.out.println("核心数"+Runtime.getRuntime().availableProcessors());

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                2,// 核心线程大小        // 相当于正在办理业务的柜台2个
                5, //  最大核心线程池大小，当队列满了才会被触发，   // 相当于暂时休息的银行柜台,如果等待区满了，就会派人来这里帮客户办理业务
                3,  // 超时等待时间，这里超时指的是 核心线程与最大核心线程池（上面两个参数）没有再被使用是就会被回收
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3), // 当队列满了，才会去触发maximumPoolSize,  //这里相当于银行柜台的等待区，
                Executors.defaultThreadFactory(),  // 线程工厂，创建线程的，一般不动
                new ThreadPoolExecutor.DiscardOldestPolicy()  // 四种拒绝策略
        );

        try{
            // 最大承载  LinkedBlockingDeque + maximumPoolSize
            for (int i = 1; i <= 100  ; i++) {
                threadPoolExecutor.execute(() -> {
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPoolExecutor.shutdown();
        }

    }
}
